Split radix multiplication

ABSTRACT

A first number is multiplied by a second number, by representing the first number as a first set of one or more W-bit wide numbers, and representing the second number as a second set of one or more W-bit wide numbers. Each of the W-bit wide numbers from the first set is paired with each of the W-bit wide numbers from the second set. For each pair of W-bit wide numbers, a set of sub-partial products is generated. Combinations of the sub-partial products are formed such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits. The W-bit wide lower partial products and the carry out terms are combined to form the product of the first number and the second number. The carry out term is advantageously representable by (W/2)+1 bits.

BACKGROUND

The present invention relates to automated multiplication, and more particularly to efficient automated multiplication that is especially well suited for multiplication of large numbers.

Hardware-implemented techniques for multiplying two numbers together are well known. In many processing system architectures, it is adequate to accomplish multiplication by iteratively instructing generic logic, such as an arithmetic logic unit (ALU), to perform suitable add and shift operations to generate the final product. However, it is often desirable to make available very fast multiplication operations, and to this end specialized multiplication logic is often provided. Such logic is often separate and apart from the central processing unit (CPU).

Hardware mapped multiplier units are very useful so long as the size (i.e., word length) of the input operands is comparable to size of the computational data paths for communicating those operands. However, in many applications (e.g., cryptographic algorithms) it is necessary to multiply together operands that are much larger than the size of the computational data path. In such cases, it is impractical to implement the desired multiplication using a hardware-mapped multiplication unit. Instead, one or both of the operands are broken up into parts, and the hardware data path is conventionally reused in a time-multiplexed fashion, operating on the parts, or words, of the input numbers. Hardware reuse is also the case for software implementation on standard microprocessors having a fixed word length data path.

The operation of carrying out a part of the multiplication for each word is denoted “partial product generation.” In order to have a fast execution time, the number of iterations is minimized by using a large word length (also denoted “high radix”) for the partial product generation. Unfortunately, higher radices imply longer carry chains and intermediate carry signals width larger word length, thereby slowing down operation and increasing power consumption. This can be seen from the following analysis:

A positive integer N-bit number a can then be written as a sequence of W-bit words a_(i) as $a = {\sum\limits_{i = 0}^{{N/W} - 1}\quad{a_{i}{2^{Wi}.}}}$ The generalization to negative and fractional numbers is straightforward, but not included in the calculations for the sake of simplicity. The multiplication of two words, x=ab may be calculated by generating partial products from the W-bit words a_(i) and b_(i), and combining the partial products. More specifically, the product x may be calculated according to ${x = {\sum\limits_{i = 0}^{{N/W} - 1}\quad{\sum\limits_{j = 0}^{{N/W} - 1}\quad{a_{i}b_{j}2^{W{({i + j})}}}}}},$ where the partial product, x_(i,j) is generated from two W-bit numbers, a_(i) and b_(j) as x _(i,j) =a _(i) b _(j). For a word length W, the partial products are simply calculated as W×W multiplications as indicated in the equation above. To calculate the complete product x=ab, all partial products are generated and added together according to their significance.

One partial product slice 101 is shown in FIG. 1. The rhombic shape is due to the significance of each of the partial product bits; significance increases when going from right to left in the figure. FIG. 2 is a diagram depicting how all of the required partial products are mathematically combined to generate the complete product. It is apparent from the figure that the computed result from one slice should be combined with the result from the neighboring slices to the left and right, and that these combination results are also accumulated with the values generated by the slices above and below.

The partial product x_(i,j) is 2^(W) bits wide, and is conventionally divided into two W-bit wide words, herein denoted carry (c_(i,j)) and lower partial product (p_(i,j)), as x _(i,j)=2^(W) c _(i,j) +p _(i,j), or c _(i,j) =int(x _(i,j)/2^(W)) and p _(i,j) =x _(i,j) mod2^(W), where “int( )” is a function that generates the integer part of a number, and “mod n” indicates modulo n arithmetic.

Assume that it is desired to multiply two large numbers A and B, each of word length N, stored in a memory of word length W. Then, each number consists of N/W words (assuming that W is a factor of N). Let T be a storage area of 2N bits, or equivalently 2N/W words denoted t₀, t₁, . . . , t_((2N/W)−1). T is used as a working storage area in which carry and lower partial product terms are accumulated until the final product, x, is generated. The final values for t₀, t₁, . . . , t_((2N/W)−1) are efficiently generated from carry terms, previously-generated lower partial products, and interim values of t₀, t₁, . . . , t_((2N/W)−1) as follows (where the symbol “: =” denotes a processing operation whereby already-existing (“old”) values of terms are combined as indicated on the right side of the symbol, with the result being assigned to the indicated “new” term on the left side of the symbol): t₀ := p_(0, 0) t₁ := c_(0, 0) + p_(1, 0) t₂ := c_(1, 0) + p_(2, 0) ⋮ t₁ := t₁ + p_(0, 1) t₂ := t₂ + c_(0, 1) + p_(1, 1) t₃ := t₃ + c_(1, 1) + p_(2, 1) ⋮ That is, operations take place in a right-to-left, top to bottom order, starting with the horizontal direction first as illustrated in FIG. 3. For example, in FIG. 3 it can be seen that the word b₀ is first applied against each of the words a₀ . . . a_((N/W)−1) to generate corresponding lower partial products p_(0,0) . . . P_((N/W)−1,(N/W)−1), carry terms c_(0,0) . . . c_((N/W)−1, (N/W)−1), and words t₀ . . . t_((N/W)−1) before the next word b, is applied against the words a₀ . . . a_((N/W)−1), and so on.

FIG. 4 is a logic diagram illustrating conventional logic of an exemplary row 301 for implementing multiplication as illustrated in FIG. 3. The first row 303 can be considered a special case in which the values of t₀ . . . t_((N/W)−1) have each been initialized to zero. If the first row 303 is physically implemented by logic as depicted in FIG. 4, it can be efficiently realized by merely omitting the tk inputs from each indicated adder (k=0 . . . (N/W)−1).

FIG. 5 is a logic diagram of a generic one of the conventional partial product generators illustrated in FIG. 4. Mathematically, the outputs from the partial product generator are related to the inputs as follows: 2^(W) c _(OUT) +t _(NEW) =t _(OLD) +p _(i,j) +c _(IN), where P_(i,j) is a lower partial product. (It will be noted that, in order to ease the notational burden in this description, the carry term supplied to a partial product generator is henceforth referred to as “c_(IN)”, and the carry term provided as an output from the partial product generator is henceforth referred to as “c_(OUT)”.) While t_(NEW) and t_(OLD) may be maintained separately, in practical embodiments it is often most efficient to maintain a single value of t in storage, with t_(OLD) being the value read out of storage, and t_(NEW) being the value to be written back.

It will now be shown how this expression can be used to derive the minimum word length of the carry signal. Since p_(i,j)=a_(i)b_(j), and a_(i), b_(j)≦2^(W)−1, it follows that: p _(i,j)≦(2W ⁻¹)². Furthermore, the word length of t is W bits, and thus t≦2^(W)−1. Thus, if we collect the carry terms on the left side of the relationship, and collect the t terms on the right side of the relationship, we find that 2^(W) c _(OUT) −c _(IN) =t _(OLD) −t _(NEW) +P _(i,j). The right side of the equation can be set to its maximum value by letting t_(NEW) be set to zero (i.e., its minimum value), and by letting t_(OLD) and p_(i,j) each be set to their respective maximum values. This yields the following relationship: 2^(W)c_(OUT) − c_(IN) ≤ (2^(W) − 1) + (2^(W) − 1)²   = 2^(W)(2^(W) − 1) Since c_(IN) is, by definition, greater than or equal to zero, and since the relationship must be true for all values of c_(IN) (i.e., including c_(IN)=0), it can be concluded that c_(OUT)≦(2^(W)−1). Furthermore, the word length of the carry in signal is the same as the carry out signal. Therefore, c _(IN) ,c _(OUT)≦2^(W)−1.

From the previous discussion, two statements can be made regarding the shown radix-2^(W) approach:

-   -   1. All data words, including carry signals, are W bits wide.     -   2. The carry propagate chain for the radix-2^(W) partial product         generator approach is 2^(W) bits long.

The length of the carry propagate chain sets the upper limit on the speed of a partial product generator implementation, and the size of the propagated carry sets the limit on the maximum required word length of the data path.

It is common to increase multiplication speed by using modified Booth encoding, Wallace adders to compress the number of partial products, and faster addition schemes for carry propagation summation. Booth encoding is discussed in A. D. Booth, “A signed binary multiplication technique,” Quarterly Journal of Mechanics and Applied Mathematics, vol. 4, pp. 236-240, 1951; and in L. P. Rubinfield, “A proof of the modified Booth algorithm for multiplication,” IEEE Transactions on Computers, October 1975, both of which are hereby incorporated herein by reference. Wallace adders are discussed in C. Wallace, “A suggestion for a fast multiplier,” IEEE Transactions on Electronic Computers, vol. EC-13, February 1964, which is hereby incorporated herein by reference.

The choice of radix for the partial product generation implementation depends on a number of factors, mainly including constraints on clock frequency, area, available data word length, and latency. To have a fast and area-efficient partial product generation, the word length, or radix, has to be limited. A restricted word length results in a larger number of partial products, which takes more time to add together when producing the full word length product. Thus, the choice of a radix for the partial product generator results in a sub-optimal solution.

The use of Booth encoding, or other means to speed up partial product generation, may speed up calculation of the actual partial product, but the word length of the intermediate carry signal remains the same, thus not improving the time required for addition of the partial products.

It is therefore desirable to provide improved methods and apparatuses for multiplying large numbers together.

SUMMARY

It should be emphasized that the terms “comprises” and “comprising”, when used in this specification, are taken to specify the presence of stated features, integers, steps or components; but the use of these terms does not preclude the presence or addition of one or more other features, integers, steps, components or groups thereof.

In accordance with one aspect of the present invention, the foregoing and other objects are achieved in methods, apparatuses and computer readable storage media for multiplying a first number by a second number, where the first number is represented as a first set of one or more W-bit wide numbers, and the second number is represented as a second set of one or more W-bit wide numbers. In accordance with an aspect of the invention, each of the W-bit wide numbers from the first set is paired with each of the W-bit wide numbers from the second set. For each pair of W-bit wide numbers, a set of sub-partial products is generated. Combinations of the sub-partial products are formed such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits. The W-bit wide lower partial products and the carry out terms are combined to form the product of the first number and the second number. In some embodiments, each of the carry out terms is representable by (W/2)+1 bits.

In one aspect, the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1. In some embodiments, each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +p _(i) =a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN), where p_(i) is a W-bit wide lower partial product, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.

In alternative embodiments, each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) t _(NEW) =t _(OLD) +a _(i) ^(L) b _(j) ^(L) + _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN) where t_(OLD) is a W-bit wide term representing an accumulation of previously generated lower partial products and carry terms, t_(NEW) is a W-bit wide term representing a new accumulation of previously and presently generated lower partial products and carry terms, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i−H) ^(H)=0 when i=0.

In yet another aspect of the invention, in either of these embodiments, offset binary coding is used to represent a_(i); b_(j) is represented in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$ and the logic functions of bits of a_(i) are used to select either b_(h) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.

In still other aspects of the invention, methods, apparatuses and computer readable storage media are for generating a partial product that is for use in multiplying a first number by a second number, wherein the first number is represented as a first set of one or more W-bit wide numbers, and the second number is represented as a second set of one or more W-bit wide numbers. Such methods, apparatuses and computer readable storage media are based on receiving a first W-bit wide number from the first set of one or more W-bit wide numbers; and receiving a second W-bit wide number from the second set of one or more W-bit wide numbers. The first W-bit wide number and the second W-bit wide number are used to generate a set of sub-partial products. Combinations of the sub-partial products are formed such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits.

In some of these embodiments, the carry out term is representable by (W/2)+1 bits.

The various embodiments of the invention may be used whenever multiplication is to be performed between two or more numbers. Because of the many advantageous properties presented by the invention (including those properties expressly stated herein as well as others that are immediately apparent to those skilled in the art), the invention is especially useful whenever large numbers are to be multiplied together. Of course, what constitutes a “large” number will vary from one application to another. In some applications, a number may be considered “large” if it is about 4 times the computational data path (e.g., 4096 bits used in cryptography). Thus, the invention may advantageously be applied in the field of cryptography, as well as many other fields. When used in cryptography, the invention may be used as part of a Montgomery multiplication process, or alternatively as a “stand-alone” process for multiplying two or more numbers together.

BRIEF DESCRIPTION OF THE DRAWINGS

The objects and advantages of the invention will be understood by reading the following detailed description in conjunction with the drawings in which:

FIG. 1 is a diagram showing one partial product slice.

FIG. 2 is a diagram depicting how all of the required partial products are combined to generate a complete product.

FIG. 3 is a diagram illustrating how outputs from partial product slices are combined in a right-to-left, top to bottom order, to generate a final product.

FIG. 4 is a logic diagram illustrating conventional logic of an exemplary row 301 for implementing multiplication as illustrated in FIG. 3.

FIG. 5 is a logic diagram of a generic one of the conventional partial product generators illustrated in FIG. 4.

FIG. 6 illustrates a technique for multiplying two numbers together by breaking them up into numbers that are representable by fewer bits than the original two numbers, multiplying these numbers together to generate partial products, and then combining these partial products to generate the desired product.

FIG. 7 is a diagram that illustrates a technique for generating the partial products of FIG. 6 by breaking up the numbers into other numbers representable by even fewer bits, multiplying these numbers together to generate other partial products, and then combining these other partial products together to generate the desired partial product.

FIG. 8 is a diagram that illustrates, for the case of W/2-bit by W/2-bit multiplications, how the sub-partial products take the place of the partial products shown in FIG. 6.

FIG. 9 is a flow diagram that illustrates the general case of the split-radix multiplication techniques described herein.

FIG. 10 illustrates how the sub-partial products generated from a W-bit by W-bit multiply may be advantageously grouped for the cases in which for each pair of W-bit wide numbers, a set of sub-partial products is generated by performing W/2 by W/2-bit multiplications.

FIG. 11 is a block diagram of a new partial product generator based on the above-described groupings.

FIG. 12 is a diagram depicting how all of the required partial products are mathematically combined to generate a complete product in accordance with an aspect of the invention.

FIG. 13 is a logic diagram of an embodiment of a new partial product generator that also accumulates sub-partial products of like significance from earlier operations.

FIG. 14 illustrates the division of the input words into W×W blocks that the algorithm works on, in accordance with an aspect of the invention.

FIG. 15 illustrates how a split radix Montgomery algorithm is created, in accordance with an aspect of the invention, by dividing all computing blocks of FIG. 14 into sub-blocks containing three or four radix-2^(W/2) blocks.

DETAILED DESCRIPTION

The various features of the invention will now be described with reference to the figures, in which like parts are identified with the same reference characters.

The various aspects of the invention will now be described in greater detail in connection with a number of exemplary embodiments. To facilitate an understanding of the invention, many aspects of the invention are described in terms of sequences of actions to be performed by elements of a computer system. It will be recognized that in each of the embodiments, the various actions could be performed by specialized circuits (e.g., discrete logic gates interconnected to perform a specialized function), by program instructions being executed by one or more processors, or by a combination of both. Moreover, the invention can additionally be considered to be embodied entirely within any form of computer readable carrier, such as solid-state memory, magnetic disk, optical disk or carrier wave (such as radio frequency, audio frequency or optical frequency carrier waves) containing an appropriate set of computer instructions that would cause a processor to carry out the techniques described herein. Thus, the various aspects of the invention may be embodied in many different forms, and all such forms are contemplated to be within the scope of the invention. For each of the various aspects of the invention, any such form of embodiments may be referred to herein as “logic configured to” perform a described action, or alternatively as “logic that” performs a described action.

To overcome the problem of the sub-optimal radix selection, the techniques described herein use dual radices: one for the word length of the computational data path, and one for the calculations of the partial products. This is referred to herein as “split radix”. Using dual radices helps reach a more optimal implementation: data is addressed with a larger word length, and arithmetic operations in the partial product generator are made with a smaller word length. As a result, the data bandwidth remains the same while arithmetic calculations become faster and more efficient.

To facilitate an understanding of the basis for the split radix design, consider FIG. 6, which illustrates partial products that are generated when multiplying together two operands, a and b. Assume that the lengths of a and b are each integer multiples of a word length W. (Even if they are not initially of such a length, their length could always be extended as necessary—for example by padding with zeroes or by sign extension—to force their lengths to be integer multiples of W.) As explained in the Background section, the N-bit number a can then be written as a sequence of W-bit words a_(i) as $a = {\sum\limits_{i = 0}^{{N/W} - 1}\quad{a_{i}{2^{Wi}.}}}$

Similarly, the M-bit number b can be written as a sequence of W-bit words b_(j) as $b = {\sum\limits_{j = 0}^{{M/W} - 1}\quad{b_{j}{2^{Wj}.}}}$ The multiplication of the two words, x=ab may be calculated by generating partial products from the W-bit words a_(i) and b_(j), and combining the partial products. More specifically, the product x may be calculated according to ${x = {\sum\limits_{i = 0}^{{N/W} - 1}\quad{\sum\limits_{j = 0}^{{M/W} - 1}\quad{a_{i}b_{j}2^{W{({i + j})}}}}}},$ where the partial product, x_(i,j) is generated from two W-bit numbers, a_(i) and b_(j) as x _(i,j) =a _(i) b _(j).

Each of the partial products x_(i,j) will be 2W bits long. In practical implementations, the multiplication by 2^(W(i+j)) is performed by aligning the partial product x_(i,j) so that it has the proper significance when combined with other partial products. For example, the partial product x_(i,j) may be left-shifted by W(i+j) bits (inserting “zeroes” as the fill bits) in order to accomplish the multiplication by 2^(W(i+j)).

This technique for multiplying two numbers together is illustrated in FIG. 6. Here it can be seen that a first partial product, a₀b₀, is generated by multiplying the two words a₀ and b₀ together. A next partial product a₁b₀ is generated by multiplying the two words a₁ and b₀ together. To effect multiplying the partial product a₁b₀ by 2^(W(0+1))=2^(W), the partial product a₁b₀ is aligned W bits to the left of the first partial product a₀b₀. The remaining partial products are similarly generated and aligned, so that they may be summed to form the final product ab, as shown in the figure.

In accordance with one aspect of the invention, it is recognized that each of the W-bit by W-bit multiplies can itself be broken up into a series of W/2-bit by W/2-bit multiplies. Mathematically, what we have is a₁=a_(i) ^(H)2^(W/2)+a_(i) ^(L) and b_(j)=b_(j) ^(H)2^(w/2) +b _(j) ^(L). The product a_(i)b_(j) is then generated as $\begin{matrix} {{a_{i} \times b_{j}} = {\left( {{a_{i}^{H}2^{W/2}} + a_{i}^{L}} \right) \times \left( {{b_{j}^{H}2^{W/2}} + b_{j}^{L}} \right)}} \\ {= {{a_{i}^{H}b_{j}^{H}2^{W}} + {\left( {{a_{i}^{H}b_{j}^{L}} + {a_{i}^{L}b_{j}^{H}}} \right)2^{W/2}} + {a_{i}^{L}b_{j}^{L}}}} \end{matrix}$ FIG. 7 is a diagram that illustrates these partial products being generated and properly aligned to permit their sum to represent the product a_(i)b_(j).

In accordance with another aspect of the invention, each of the W-bit by W-bit multiplies illustrated in FIG. 6 can itself be broken up into a series of smaller multiplications, such as a series of W/2-bit by W/2-bit multiplies as illustrated in FIG. 7. This results in the generation of what are herein referred to as sub-partial products. For the case of W/2-bit by W/2-bit multiplies, FIG. 8 illustrates how the sub-partial products take the place of the partial products shown in FIG. 6.

In the general case, the split-radix multiplication technique includes the steps illustrated in FIG. 9. To multiply a first number by a second number, the first number is represented as a first set of one or more W-bit wide numbers (step 901), and the second number is represented as a second set of one or more W-bit wide numbers (step 903). Each of the W-bit wide numbers from the first set is paired with each of the W-bit wide numbers from the second set (step 905). For each pair of W-bit wide numbers, a set of sub-partial products is generated (step 907). Combinations of the sub-partial products are formed such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits (step 909). For example, when the sub-partial products are the result of performing W/2 by W/2-bit multiplications, the carry out terms are representable by (W/2)+1 bits. The W-bit wide lower partial products and the carry out terms are combined to form the product of the first number and the second number (step 911).

In accordance with yet another aspect of the invention in which for each pair of W-bit wide numbers, a set of sub-partial products is generated by performing W/2 by W/2-bit multiplications, the sub-partial products generated from the W-bit by W-bit multiply may be advantageously grouped as illustrated in FIG. 10. Two types of groupings are illustrated: a first grouping type 1001 that involves the addition of four sub-partial products, and a second grouping type 1003 that involves the addition of only three sub-partial products. The second grouping type 1003 can be considered a special case of the first grouping type 1001, in which one of the four sub-partial products is always zero.

In some embodiments, a third grouping can also be constructed for use in the most-significant position of the partial product generation (e.g., the left-most position of a row of sub-partial product generators) in that fewer than four sub-partial products will need to be combined in this position. In many embodiments, it is advantageous simply to use enough ones of the first grouping type 1001 for the size of the product that it is intended to generate.

In accordance with an aspect of the invention, a new type of partial product generator (PPG) generates its outputs based on these groupings. In the general case, the new partial product generator receives a_(i), b_(j), a^(H) _(i-1), a value t, and a carry-in value (c_(in)) as its input parameters (where i=0, . . . , L−1; and L=the number of W-bit words that make up the number a). The final values for t₀, t₁, . . . , t_((2N/W)−1) may be efficiently generated from carry terms, previously-generated lower partial products, and interim values of t₀, t₁, . . . , t_((2N/W)−1) in the manner previously described with respect to the conventional PPG, except that it will be recognized that different values will be obtained because the carry terms themselves will take on different values.

Like the conventional type PPG, the new PPG uses W-bit wide input operands (except for the carry-in operand, which is only $\frac{W}{2} + 1$ bits wide). However, unlike the conventional type PPG, the new PPG generates an output that is, in total, $\frac{3W}{2} + 1$ bits wide.

A new PPG 1101 based on the above-described groupings can be schematically depicted as in FIG. 11. Here it can be seen that the a_(i) and b_(j) inputs are only W-bits wide, and that the output from this new PPG 1101 is $\frac{3W}{2} + 1$ bits wide. The shape depicted in FIG. 11 is representational of the significance of the four sub-partial products that are summed within the new PPG 1101.

In another aspect of the invention, the $\frac{3W}{2} + 1$ bit wide output from the new PPG is divided into a W-bit wide lower partial product p_(i,j) that is propagated in a vertical direction (i.e., combined with previously-generated and later-generated terms of like significance), and $\frac{W}{2} + 1$ carry part c_(i,j) that is propagated in the horizontal direction (i.e., to a term of higher significance).

Operations using the new PPG take place in a right-to-left, top to bottom order, starting with the horizontal direction first as earlier-illustrated in FIG. 3.

FIG. 12 is a diagram depicting how all of the required partial products are mathematically combined to generate the complete product. It is apparent from the figure that the computed result from one slice should be combined with the result from the neighboring slices to the left and right, and that these combination results are also accumulated with the values generated by the slices above and below. It can be seen in the figure that in each row, the right-most (i.e., least significant) PPG is depicted in the shape of the number “7”, to indicate that only three sub-partial products are generated and accumulated within the PPG.

FIG. 13 is a logic diagram of an embodiment of a new PPG 1301 that also accumulates sub-partial products of like significance from earlier operations. Consequently, the output of the new PPG 1301 includes a t term rather than a p term as the lower partial product. As can be seen, this is a very compact design that utilizes only four size W/2×W/2 multipliers 1303, 1305, 1307, 1309. These multipliers 1303, 1305, 1307, 1309 are arranged, along with three adders 1311, 1313, 1315 to generate carry-out (c_(OUT)) and t_(NEW) as follows: 2^(W) c _(OUT) +t _(NEW) =t _(OLD) +a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN). where the symbols a_(i) ^(L), a_(i) ^(H) denote the lower and higher W/2 bits of ai, respectively, and similar notation is used for the b variable. Additional logic 1317 is illustrated in the figure to represent scaling the output of the adder 1313 by a factor of 3^(W/2). However, because this is multiplication by a power of 2, it can advantageously be implemented merely by aligning the output of the adder 1313 by W/2 bits to the left (i.e., to a position of higher significance), or by performing a comparable left shift operation. Thus, it is unnecessary to use actual multiplication circuitry to accomplish this function. Also, while t_(NEW) and t_(OLD) may be maintained separately, in practical embodiments it is often most efficient to maintain a single value of t in storage, with t_(OLD) being the value read out of storage, and t_(NEW) being the value to be written back—such an embodiment is illustrated in FIG. 13.

It is possible to use the embodiment of FIG. 13 throughout the entire multiplication process if the value “0” is used for a H whenever i=0. Alternatively, the design depicted in FIG. 13 may be modified to effect a special-case version of the PPG for use whenever i=0 (i.e., for use as the right-most—i.e., least-significant—PPGs depicted in FIG. 12). This modification involves the removal of the multiplier 1305 and the adder 1311, and supplying the output of the multiplier 1303 directly to the adder 1315.

While t_(NEW) and t_(OLD) may be maintained separately, in practical embodiments it is often most efficient to maintain a single value of t in storage, with t_(OLD) being the value read out of storage, and t_(NEW) being the value to be written back.

It will now be shown how this expression can be used to derive the maximum word length of the carry signal. Since 0≦a_(i) ^(H), a_(i) ^(L), a_(i-1) ^(H), b_(j) ^(H), b_(j) ^(L)≦2^(W/2)−1, it follows that: a _(i) ^(H) b _(j) ^(H) ,a _(i) ^(L) b _(j) ^(H) ,a _(i) ^(H) b _(j) ^(L) ,a _(i) ^(L) b _(j) ^(L) ,a _(i-1) ^(H) b _(j) ^(H)≦(2^(W/2)−1)². Furthermore, the word length of t is W bits, and thus t≦2^(W)−1. Thus, if we collect the carry terms on the left side of the relationship, and collect the t terms on the right side of the relationship, we find that 2^(W) c _(OUT) −c _(IN) =t _(OLD) −t _(NEW) +a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H)). The right side of the equation can be set to its maximum value by letting t_(NEW) be set to zero (i.e., its minimum value), and by letting t_(OLD) and each of the sub-partial products be set to their respective maximum values. This yields the following relationship: 2^(W)c_(OUT) − c_(IN) ≤ (2^(W) − 1) + 2(2^(W/2) − 1)² + 2^(W/2) × 2(2^(W/2) − 1)²   = (2^(W) − 1) + 2(2^(W/2) − 1)²(1 + 2^(W/2))   = (2^(W) − 1) + (2^(W/2) − 1)² × 2(1 + 2^(W/2))   = (2^(W) − 1) + (2^(W) − 2^((W/2) + 1) + 1) × 2(1 + 2^(W/2))   = (2^(W) − 1) + (2^(W) − 2^((W/2) + 1) + 1)(2 + 2^(W/2 + 1))   = (2^(W) − 1) + (2^((3W/2) + 1) − 2^(W + 2) + 2^((W/2) + 1)+  2^(W + 1) − 2^((W/2) + 2) + 2)   = 2^((3W/2) + 1) − 2^(W + 2) + 2^(W + 1)+  2^(W) − 2^((W/2) + 2)+  2^((W/2) + 1) + 2 − 1   < 2^((3W/2) + 1) Since c_(IN) is, by definition, greater than or equal to zero, and since the relationship must be true for all values of c_(IN) (i.e., including c_(IN)=0), it can be concluded that c_(OUT)<2^((W/2)+1). Furthermore, the word length of the carry in signal is the same as the carry out signal. Therefore, c _(IN) ,c _(OUT)>2^((W/2)+1). That is, the intermediate right-to-left propagating carry for the partial product generator 201 is only half the size of the conventional approach plus one bit.

The gain from using the new split-radix multiplication method compared to the conventional technique can also be computed. Assume the word length is W bits. The conventional approach to partial product generation utilizes W×W multipliers. This results in a carry propagate chain of 2^(W) adder cells. For the new split radix multiplier, the corresponding number of cells is W+W/2+1 Thus, the carry chain is reduced by a factor ${\text{carry~~~chain~~~reduction} = {{1 - \frac{W + {W/2} + 1}{2W}} = {\frac{1}{4} - \frac{1}{2W}}}},$ that is, approaching 25% for large values of W. Two examples of realistic scenarios are:

-   -   Example 1: 16×16 bit partial product. Reduction is 21.9%     -   Example 2: 32×32 bit partial product. Reduction is 23.4%.

For multipliers and adders, the carry propagate chain is equal to the critical path. Therefore, a shorter carry chain implies an implementation of lower cost in terms of delay, area, and power consumption.

It is not possible to make a general statement about the exact magnitude of the gain because of the wide range of different multiplication and addition schemes. However, for the common ripple-carry addition scheme, often used in multipliers, the reduced carry chain implies linear reduction in delay and area, and linear or even polynomic improvement in energy per operation.

The new split radix multiplication scheme can be further optimized by using distributed arithmetic and offset binary coding, as described in A. Croisier et al., U.S. Pat. No. 3,777,130, entitled “Digital filter for PCM encoded signals” (issued December 1973); A. Peled and B. Liu, “A new hardware realization of digital filter,” IEEE Transactions on Acoustics, Speech, and Signal Processing, vol. ASSP-22, no. 6, December 1974; and A. Berkeman et al., “A low logic depth complex multiplier using distributed arithmetic,” IEEE Journal of Solid-State Circuits, vol. 35, no. 4, pp. 656-659, April 2000, each of which is hereby incorporated herein by reference. Where the a_(i) signals are offset binary coded, the b_(j) signals may be recoded as follows: $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix}.} \right.$ The following identities are also utilized: a _(i) ^(L) b _(j) ^(L) +a _(i) ^(H) b _(j) ^(L) =F(a _(i) ^(L) ,a _(i) ^(H) ,b _(j) ^(σ) ,b _(j) ^(δ)), a _(i-1) ^(H) b _(j) ^(H) +a _(i) ^(L) b _(j) ^(H) =F(a _(i-1) ^(H) ,a _(i) ^(L) ,b _(j) ^(σ) ,b _(j) ^(δ)) where the F( )-function denotes a second order distributed arithmetic multiplier with offset binary encoded input signals. Further information about this may be found in A. Berkeman and V. Öwall, “Co-Optimization of FFT and FIR in a Delayless Acoustic Echo Canceller Implementation,” Proceedings of ISCAS 2000, Geneva, Switzerland, May 2000. With this construction, the number of partial product bits for the four W/2-sized multipliers are reduced to approximately one half, with a corresponding decrease in the number of required adders in the multipliers. The recoding of the b-signals can be implemented either prior to the multiplication operation, or in the right-most partial product generator stage. A further advantage with the distributed arithmetic multipliers is that the adder 1315 with four inputs as shown in FIG. 13 is replaced by a more efficient three word input adder.

In yet another aspect of the invention, Montgomery's method of operating on data divided into words of W bits can be implemented in an algorithm that computes the product p=abr ⁻ mod n,

where r=2^(DW) is constant. The algorithm is as follows:  1: n₀ ^(′)

(−n⁻¹) mod 2^(W)  2: t

0  3: for i = 0 to D − 1 do  4:  c

0  5:  for j = 0 to D − 1 do  6:   if j = 0 then  7:    m_(i)

(t₀ + a₀b_(i))n₀ ^(′) mod 2^(W)  8:   endif  9:   2^(W) c + t_(j)

t_(j) + a_(j)b_(i) + n_(j)m_(i) + c 10:  end for 11: t

t/2^(W) 12: end for 13: if t ≧ n then 14:   p

t − n 15: else 16:   p

t 17: end if For each iteration of the loop variable i, the least significant W bits are set to zero and the partial result is shifted W bits to the right.

FIG. 14 illustrates the division of the input words into W×W blocks that the algorithm works on. There are two different kinds of blocks: right-most (i.e., least significant) preprocessing blocks (identified by “pre-proc” in the figure) that perform the zeroing of the least significant word according to lines 6-9 of the algorithm; and “standard” Montgomery blocks (identified by “MPPG” in the figure) that compute only line 9 of the algorithm. The standard Montgomery blocks dominate the complexity of the algorithm.

The split radix Montgomery algorithm is created by dividing all computing blocks of FIG. 14 into sub-blocks, containing three or four radix-2^(W/2) blocks (identified as “MsPPG” in the figure) as illustrated in FIG. 15. In the figure, the square brackets indicate that the designated data has to be read from or written to a memory. Other variables are passed between the consecutive steps and stored intermediately.

Using the notation ñ=n′₀ mod 2^(W/2), and a_(j) ^(L), a_(j) ^(H) are the least and most significant W/2 bits of a_(j), and so forth, the rightmost blocks of FIG. 15 compute the following operations: MemRead: t=t₀, a=a₀, n=n₀, b=b_(i) 1: (2^(W/2) c ₀ +s ₀)←t^(L) +a ^(L) b ^(L) 2: m ^(L) ←s ₀ ñ mod 2^(W/2) 3: (2^(W/2) c ₀ +s ₀)←(2^(W/2) c ₀ +s ₀)+n ^(L) m ^(L) 4: (2^(W/2) c ₁ +s ₁)←t ^(H) +a ^(H) b ^(L) +a ^(L) b ^(H) +n ^(H) m ^(L) +c ₀ 5: m ^(H) ←s ₁ ñ mod 2^(W/2) 6: (2^(W/2) c ₁ +s ₁)+(2^(W/2) c ₁ +s ₁)+n ^(L) m ^(H) thereby zeroing the least W bits (corresponding to th and t) and feeding a carry c=c₁, and the signals b and m to the next step. The remaining blocks then compute: MemRead: t=t_(j), a=a_(j), n=n_(j), c 1: (2^(W/2) c ₀ +s ₀)←t ^(L) +a ^(L) b ^(L) +a′ ^(H) b ^(H) +n ^(L)m^(L) +n′ ^(H) m ^(H) +c 2: (2^(W/2) c ₁ +s ₁)←t ^(H) +a ^(H) b ^(L) +a ^(L) b ^(H) +n ^(H) m ^(L) +n ^(L) m ^(H) +c ₀ MemWrite: t _(i-1)=2^(W/2) s ₁ +S ₀ Between the blocks, a carry c=c, is propagated, as well as the values that are shared and propagated: a′^(H)=a_(j−1) ^(H), n′^(H)=n_(j−1) ^(H), b_(i), and m_(i).

Looking again at the operations performed in the non-rightmost blocks in FIG. 14, it can be seen that eight W/2×W/2 multiplications are required. One W×W multiplier is equivalent to four W/2×W/2 multipliers in terms of the number of partial product bits, but as seen before in the general case, the reordering shortens the length of the carry chain, and reduces the word length of the intermediate carry signal.

Applying distributed arithmetic and offset binary coding, denote $\left\{ {\begin{matrix} {b_{i}^{\sigma} = {b_{i}^{H} + b_{i}^{L}}} \\ {b_{i}^{\delta} = {b_{i}^{H} - b_{i}^{L}}} \end{matrix}{and}\left\{ {\begin{matrix} {m_{i}^{\sigma} = {m_{i}^{H} + m_{i}^{L}}} \\ {m_{i}^{\delta} = {m_{i}^{H} - m_{i}^{L}}} \end{matrix}.} \right.} \right.$ Then, the scalar products can be written more efficiently as a ^(L) b ^(L) +a′ ^(H) b ^(H) =F(a ^(L) ,a′ ^(H) ,b _(σ) ,b _(δ)) n ^(L) m ^(L) +n′ ^(H) m ^(H) =F(n ^(L) ,n′ ^(H) ,m _(σ) ,m _(δ)) a ^(H) b _(L) +a ^(L) b ^(H) =F(a ^(H) ,a ^(L) ,b _(σ) ,b _(δ)) n ^(H) m ^(L) +n ^(L) m ^(H) =F(n ^(H) ,n ^(L) ,m _(σ) ,m _(δ)) where the F-function denotes a distributed arithmetic multiplier as before.

A further optimization step is found by generating all of the sums and differences of b_(σ), b_(δ), m_(σ), and m_(δ); in total 16 combinations. Actually, only half of them need be generated because the other half have the same absolute value but opposite sign. Now, only hardware corresponding to one size W/2×W/2 multiplier plus some multiplexers is required for the implementation, and the memory addressing scheme still remains the same.

The above-described strategy for multiplying numbers together has advantageous properties, including but not limited to the following:

-   -   1. The same addressing and word lengths are used as in the         conventional approach. That is, since the input/output data word         length is kept at W bits, the same number of partial products is         generated as in the conventional approach, and accessing of data         remains the same.     -   2. The carry propagate chain is shortened from 2^(W) bits to 3         W/2+2 bits. Having a shorter carry propagate chain means that         the calculation and addition of a partial product will be faster         than in the conventional approach. Furthermore, switching         activity is reduced, and energy consumption is lower.     -   3. The intermediate carry signal is shortened from W bits to         W/2+1 bits. Thus, fewer bits have to be propagated and added         from one slice to a following slice. This helps increase speed         and reduce energy consumption due to less switching activity.     -   4. The only additional requirement is intermediate forwarding of         the W/2 bits of a_(i-1) ^(H).     -   5. The required hardware area for implementation of the new         multiplication strategy will be the same or less than that         required for the conventional approach due to the reduced word         length of the carry signals.     -   6. Modified Booth encoding and similar devices are still         applicable to the radix-2^(W/2) multipliers, further reducing         delay and area.     -   7. Distributed arithmetic and offset binary coding is an         efficient means to reduce speed and area of the split radix         partial product generator.     -   8. Applications include efficient calculation of Montgomery         multiplication, for use in, for example, cryptographic         applications.     -   9. Applications, including cryptographic applications, may use         the split-radix multiplication techniques “as is” (i.e., outside         the context of Montgomery multiplication).

The invention has been described with reference to a particular embodiment. However, it will be readily apparent to those skilled in the art that it is possible to embody the invention in specific forms other than those of the preferred embodiment described above. This may be done without departing from the spirit of the invention.

For example, an embodiment was described above with respect to FIG. 13 in which a new PPG 1301 also accumulates sub-partial products of like significance from earlier operations. However, in alternative embodiments, it is possible for each PPG to merely generate 2^(W) c _(OUT) +p _(i) =a _(i) ^(L) b _(j) ^(L) a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) +b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))c _(IN), where p_(i), is a W-bit wide lower partial product. In this embodiment, the accumulation is performed separately in one or more subsequent steps.

Also, the invention has been described in the context of multiplying two numbers together. However, it will be readily apparent that the same principles of split-radix multiplication may be applied to perform multiplication between more than two numbers. In such cases, sub-partial products are formed from the various operands and combined in the manner described above.

Thus, the preferred embodiment is merely illustrative and should not be considered restrictive in anyway. The scope of the invention is given by the appended claims, rather than the preceding description, and all variations and equivalents that fall within the range of the claims are intended to be embraced therein. 

1. A method of multiplying a first number by a second number, the method comprising: representing the first number as a first set of one or more W-bit wide numbers; representing the second number as a second set of one or more W-bit wide numbers; pairing each of the W-bit wide numbers from the first set with each of the W-bit wide numbers from the second set; for each pair of W-bit wide numbers, generating a set of sub-partial products; forming combinations of the sub-partial products such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits; and combining the W-bit wide lower partial products and the carry out terms to form the product of the first number and the second number.
 2. The method of claim 1, wherein each of the carry out terms is representable by (W/2)+1 bits.
 3. The method of claim 2, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +p _(i) =a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c_(IN), where p_(i) is a W-bit wide lower partial product, c_(IN) is a (W/2)+1 bit wide carry-in term, C_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 4. The method of claim 3, comprising: using offset binary coding to represent a_(i); representing b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and using the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 5. The method of claim 2, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +t _(NEW) =t _(OLD) +a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN) where t_(OLD) is a W-bit wide term representing an accumulation of previously generated lower partial products and carry terms, t_(NEW) is a W-bit wide term representing a new accumulation of previously and presently generated lower partial products and carry terms, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and ache a_(i-1) ^(H)=0 when i=0.
 6. The method of claim 5, comprising: using offset binary coding to represent a_(i); representing b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and using the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 7. An apparatus for multiplying a first number by a second number, the apparatus comprising: logic that represents the first number as a first set of one or more W-bit wide numbers; logic that represents the second number as a second set of one or more W-bit wide numbers; logic that pairs each of the W-bit wide numbers from the first set with each of the W-bit wide numbers from the second set; logic that generates a set of sub-partial products for each pair of W-bit wide numbers; logic that forms combinations of the sub-partial products such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits; and logic that combines the W-bit wide lower partial products and the carry out terms to form the product of the first number and the second number.
 8. The apparatus of claim 7, wherein each of the carry out terms is representable by (W/2)+1 bits.
 9. The apparatus of claim 8, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +p _(i) =a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN), where p_(i) is a W-bit wide lower partial product, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a H=0 when i=0.
 10. The apparatus of claim 9, comprising: logic that uses offset binary coding to represent a_(i); logic that represents b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and logic that uses the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 11. The apparatus of claim 8, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(out) t _(NEW) =t _(OLD) +a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN) where t_(OLD) is a W-bit wide term representing an accumulation of previously generated lower partial products and carry terms, t_(NEW) is a W-bit wide term representing a new accumulation of previously and presently generated lower partial products and carry terms, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 12. The apparatus of claim 11, comprising: logic that uses offset binary coding to represent a_(i); logic that represents b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and logic that uses the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 13. A computer readable storage medium having stored therein one or more instructions that cause a processor to multiply a first number by a second number, the one or more instructions causing a processor to perform: representing the first number as a first set of one or more W-bit wide numbers; representing the second number as a second set of one or more W-bit wide numbers; pairing each of the W-bit wide numbers from the first set with each of the W-bit wide numbers from the second set; generating a set of sub-partial products for each pair of W-bit wide numbers; forming combinations of the sub-partial products such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits; and combining the W-bit wide lower partial products and the carry out terms to form the product of the first number and the second number.
 14. The computer readable storage medium of claim 13, wherein each of the carry out terms is representable by (W/2)+1 bits.
 15. The computer readable storage medium of claim 14, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +p _(i) =a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN), where p_(i) is a W-bit wide lower partial product, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 16. The computer readable storage medium of claim 15, wherein the one or more instructions cause the processor to perform: using offset binary coding to represent a_(i); representing b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and using the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 17. The computer readable storage medium of claim 14, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(K), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(out) +t _(NEW) =t _(OLD) +a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN) where t_(OLD) is a W-bit wide term representing an accumulation of previously generated lower partial products and carry terms, t_(NEW) is a W-bit wide term representing a new accumulation of previously and presently generated lower partial products and carry terms, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 18. The computer readable storage medium of claim 17, wherein the one or more instructions cause the processor to perform: using offset binary coding to represent a_(i); representing b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and using the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 19. A method of generating a partial product that is for use in multiplying a first number by a second number, wherein the first number is represented as a first set of one or more W-bit wide numbers, and the second number is represented as a second set of one or more W-bit wide numbers, the method comprising: receiving a first W-bit wide number from the first set of one or more W-bit wide numbers; receiving a second W-bit wide number from the second set of one or more W-bit wide numbers; using the first W-bit wide number and the second W-bit wide number to generate a set of sub-partial products; and forming combinations of the sub-partial products such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits.
 20. The method of claim 19, wherein the carry out term is representable by (W/2)+1 bits.
 21. The method of claim 20, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +p _(i) =a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN), where p_(i) is a W-bit wide lower partial product, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 22. The method of claim 21, comprising: using offset binary coding to represent a_(i); representing b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and using the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 23. The method of claim 20, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +t _(NEW) =t _(OLD) +a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN) where t_(OLD) is a W-bit wide term representing an accumulation of previously generated lower partial products and carry terms, t_(NEW) is a W-bit wide term representing a new accumulation of previously and presently generated lower partial products and carry terms, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 24. The method of claim 23, comprising: using offset binary coding to represent a_(i); representing b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and using the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 25. A partial product generator for use in multiplying a first number by a second number, wherein the first number is represented as a first set of one or more W-bit wide numbers, and the second number is represented as a second set of one or more W-bit wide numbers, the apparatus comprising: logic that receives a first W-bit wide number from the first set of one or more W-bit wide numbers; logic that receives a second W-bit wide number from the second set of one or more W-bit wide numbers; logic that uses the first W-bit wide number and the second W-bit wide number to generate a set of sub-partial products; logic that forms combinations of the sub-partial products such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits.
 26. The partial product generator of claim 25, wherein the carry out term is representable by (W/2)+1 bits.
 27. The partial product generator of claim 26, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), that are input into the partial product generator, a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +p _(i) =a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN), where p_(i) is a W-bit wide lower partial product, c_(IN) is a (W/2)+1 bit wide carry-in term, C_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 28. The partial product generator of claim 27, comprising: logic that uses offset binary coding to represent a_(i); logic that represents b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and logic that uses the logic functions of bits of a_(i) to select either b_(h) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 29. The partial product generator of claim 26, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), that are input into the partial product generator a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +t _(NEW) =t _(OLD) +a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN) where t_(OLD) is a W-bit wide term representing an accumulation of previously generated lower partial products and carry terms, t_(NEW) is a W-bit wide term representing a new accumulation of previously and presently generated lower partial products and carry terms, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 30. The partial product generator of claim 29, comprising: logic that uses offset binary coding to represent a_(i); logic that represents b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and logic that uses the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 31. A computer readable storage medium having stored therein one or more instructions for generating a partial product that is for use in multiplying a first number by a second number, wherein the first number is represented as a first set of one or more W-bit wide numbers, and the second number is represented as a second set of one or more W-bit wide numbers, wherein the one or more instructions cause a processor to perform: receiving a first W-bit wide number from the first set of one or more W-bit wide numbers; receiving a second W-bit wide number from the second set of one or more W-bit wide numbers; using the first W-bit wide number and the second W-bit wide number to generate a set of sub-partial products; and forming combinations of the sub-partial products such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits.
 32. The computer readable storage medium of claim 31, wherein the carry out term is representable by (W/2)+1 bits.
 33. The computer readable storage medium of claim 32, wherein: the first number is representable by N bits, N≧0 the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L), are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +p _(i) =a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN), where p_(i) is a W-bit wide lower partial product, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 34. The computer readable storage medium of claim 33, comprising: using offset binary coding to represent a_(i); representing b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and using the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 35. The computer readable storage medium of claim 32, wherein: the first number is representable by N bits, N≧0; the second number is representable by M bits, M≧0; for each pair of W-bit wide numbers, (a_(i), b_(j)), a _(i) =a _(i) ^(H)2^(W/2) +a _(i) ^(L) and b _(j) =b _(j) ^(H)2^(W/2) +b _(j) ^(L), where a_(i) ^(H), a_(i) ^(L), b_(j) ^(H), b_(j) ^(L) are each W/2-bit wide numbers, 0≦i≦N/W−1, and 0≦j≦M/W−1; and each of the combinations of the sub-partial products is formed in accordance with: 2^(W) c _(OUT) +t _(NEW) =t _(OLD) +a _(i) ^(L) b _(j) ^(L) +a _(i-1) ^(H) b _(j) ^(H)+2^(W/2)(a _(i) ^(H) b _(j) ^(L) +a _(i) ^(L) b _(j) ^(H))+c _(IN) where t_(OLD) is a W-bit wide term representing an accumulation of previously generated lower partial products and carry terms, t_(NEW) is a W-bit wide term representing a new accumulation of previously and presently generated lower partial products and carry terms, c_(IN) is a (W/2)+1 bit wide carry-in term, c_(OUT) is a (W/2)+1 bit wide carry-out term, and a_(i-1) ^(H)=0 when i=0.
 36. The computer readable storage medium of claim 35, comprising: using offset binary coding to represent a_(i); representing b_(j) in accordance with $\left\{ {\begin{matrix} {b_{j}^{\sigma} = {b_{j}^{L} + b_{j}^{H}}} \\ {b_{j}^{\delta} = {b_{j}^{L} - b_{j}^{H}}} \end{matrix};} \right.$  and using the logic functions of bits of a_(i) to select either b_(j) ^(σ) or b_(j) ^(δ) in forming each of the combinations of the sub-partial products.
 37. A method of performing Montgomery multiplication between a first number and a second number, wherein the first number is represented as a first set of one or more W-bit wide numbers, and the second number is represented as a second set of one or more W-bit wide numbers, the method comprising: receiving a first W-bit wide number from the first set of one or more W-bit wide numbers; receiving a second W-bit wide number from the second set of one or more W-bit wide numbers; using the first W-bit wide number and the second W-bit wide number to generate a set of sub-partial products; and forming combinations of the sub-partial products such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits.
 38. An apparatus for performing Montgomery multiplication between a first number and a second number, wherein the first number is represented as a first set of one or more W-bit wide numbers, and the second number is represented as a second set of one or more W-bit wide numbers, the apparatus comprising: logic that receives a first W-bit wide number from the first set of one or more W-bit wide numbers; logic that receives a second W-bit wide number from the second set of one or more W-bit wide numbers; logic that uses the first W-bit wide number and the second W-bit wide number to generate a set of sub-partial products; and logic that forms combinations of the sub-partial products such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits.
 39. A computer readable storage medium having stored therein one or more instructions that cause a processor to perform Montgomery multiplication between a first number and a second number, wherein the first number is represented as a first set of one or more W-bit wide numbers, and the second number is represented as a second set of one or more W-bit wide numbers, the one or more instructions causing a processor to perform: receiving a first W-bit wide number from the first set of one or more W-bit wide numbers; receiving a second W-bit wide number from the second set of one or more W-bit wide numbers; using the first W-bit wide number and the second W-bit wide number to generate a set of sub-partial products; and forming combinations of the sub-partial products such that each combination is representable by a W-bit wide lower partial product and a carry out term that has fewer than W bits. 